home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 2 / AACD 2.iso / AACD / Magazine / GraphicsCards / StormMesa / src / Windows / mesa_extend.c < prev    next >
C/C++ Source or Header  |  1999-02-04  |  5KB  |  212 lines

  1. /* File: mesa_extend.c for wmesa-2.3
  2.    Written by Li Wei (liwei@aiar.xjtu.edu.cn)
  3. */
  4.  
  5. /*******************************************************************
  6.  Users can use the following keys to control the view
  7.  
  8.  The following four key combinations can shift the view correspondingly,
  9.  function in both stereo and normal mode.
  10.  Ctrl+left arrow
  11.  Ctrl+right arrow
  12.  Ctrl+up arrow
  13.  Ctrl+down arrow
  14.  
  15.  F (captital letter) shift the camera far from objects
  16.  N (captital letter) shift the camera near from objects
  17.  S (captital letter) toggle between normal and stereo mode
  18.  I (captital letter) increase the distance between two views
  19.  D (captital letter) decrease the distance between two views
  20.  
  21.  if the Key function defined by user maps any key appearing above, it will be
  22.  masked by the program. Hence, user should either modify his own code or
  23.  modify function defaultKeyProc at the end of this file 
  24. *******************************************************************/
  25.  
  26. /* Log 6/14, 1997
  27.  * revision 1.01
  28.  * struct DisplayOptions defined for tk_ddmesa.c to read the initial file
  29.  */
  30.  
  31. #include "mesa_extend.h"
  32. #include "gltk.h"
  33. #include <stdio.h>
  34. #ifndef NO_STEREO
  35.     #include "stereo.h"
  36. #endif
  37. #ifndef NO_PARALLEL
  38. //    #include "parallel.h"
  39. #endif
  40.  
  41. GLenum (*userKeyProc) (int, GLenum) = NULL;
  42.  
  43. GLfloat viewDistance = 1.0;
  44. GLfloat deltaView = 0.1;
  45. GLfloat deltaShift = 0.1;
  46.  
  47. GLuint viewShift = SHIFT_NONE;
  48. GLuint viewTag = 0 ;
  49.  
  50. GLenum imageRendered = GL_FALSE;
  51.  
  52. GLenum glImageRendered()
  53. {
  54.     return imageRendered; 
  55. }
  56.  
  57. //Code added by Li Wei to enable stereo display
  58. GLenum defaultKeyProc(int key, GLenum mask )
  59. {
  60.     GLenum flag = GL_FALSE ;
  61.     if(mask & TK_CONTROL){
  62.     flag = GL_TRUE ;
  63.     switch(key){
  64.         case TK_LEFT:
  65.         viewShift = SHIFT_LEFT;
  66.         break;
  67.         case TK_RIGHT:
  68.         viewShift = SHIFT_RIGHT;
  69.         break;
  70.         case TK_UP:
  71.         viewShift = SHIFT_UP;
  72.         break;
  73.         case TK_DOWN:
  74.         viewShift = SHIFT_DOWN;
  75.         break;
  76.         default:
  77.             flag = GL_FALSE ;
  78.         }
  79.     }
  80.     if(flag == GL_FALSE){
  81.     flag = GL_TRUE ;
  82.     switch(key){
  83.         case TK_F:
  84.         viewShift = SHIFT_FAR;
  85.         break;
  86.         case TK_N:
  87.         viewShift = SHIFT_NEAR;
  88.         break;
  89.  
  90. #if !defined(NO_STEREO)
  91.         case TK_D:
  92.         viewDistance-= deltaView;
  93.         break;
  94.         case TK_I:
  95.         viewDistance+= deltaView;
  96.         break;
  97.         case TK_S:
  98.         toggleStereoMode();
  99.         break;
  100. #endif
  101.  
  102. #if !defined(NO_PARALLEL)
  103.         case TK_P:
  104.         if(machineType == MASTER)
  105.             toggleParallelMode();
  106.         break;
  107. #endif
  108.         default:
  109.             flag = GL_FALSE;
  110.         }
  111.         }
  112.  
  113.     if(userKeyProc)
  114.         flag=flag||(*userKeyProc)(key, mask);
  115.  
  116. #if !defined(NO_PARALLEL)
  117.     if(parallelFlag&&key!=TK_P&&machineType == MASTER){
  118.         PRKeyDown(key,mask);
  119.     }
  120. #endif
  121.  
  122.     return flag;
  123. }
  124.  
  125. /* The following function implemented key board control of the display,
  126.     availabe even in normal mode so long the driver is linked into exe file.
  127. */
  128. void shiftView()
  129. {
  130.     GLfloat cm[16];
  131.     if(viewShift != SHIFT_NONE){
  132. /*    glGetFloatv(GL_MODELVIEW_MATRIX,cm);
  133.     glMatrixMode(GL_MODELVIEW);
  134. */
  135.     GLint matrix_mode;
  136.     glGetIntegerv(GL_MATRIX_MODE,&matrix_mode);
  137. /*    if(matrix_mode!=GL_PROJECTION)
  138.         glMatrixMode(GL_PROJECTION);
  139.     glGetFloatv(GL_PROJECTION_MATRIX,cm);
  140.     glLoadIdentity();
  141.     switch(viewShift){
  142.         case SHIFT_LEFT:
  143.             glTranslatef(-deltaShift,0,0);
  144.             break;
  145.         case SHIFT_RIGHT:
  146.             glTranslatef(deltaShift,0,0);
  147.             break;
  148.         case SHIFT_UP:
  149.             glTranslatef(0,deltaShift,0);
  150.             break;
  151.         case SHIFT_DOWN:
  152.             glTranslatef(0,-deltaShift,0);
  153.             break;
  154.         case SHIFT_FAR:
  155.             glTranslatef(0,0,-deltaShift);
  156.             break;
  157.         case SHIFT_NEAR:
  158.             glTranslatef(0,0,deltaShift);
  159.             break;
  160.         }
  161.  
  162.         viewShift = SHIFT_NONE;
  163.         glMultMatrixf( cm );
  164.         if(matrix_mode!=GL_PROJECTION)
  165.             glMatrixMode(matrix_mode);
  166.  
  167.     }
  168. */
  169.     if(matrix_mode!=GL_MODELVIEW)
  170.         glMatrixMode(GL_MODELVIEW);
  171.     glGetFloatv(GL_MODELVIEW_MATRIX,cm);
  172.     glLoadIdentity();
  173.     switch(viewShift){
  174.         case SHIFT_LEFT:
  175.             glTranslatef(-deltaShift,0,0);
  176.             break;
  177.         case SHIFT_RIGHT:
  178.             glTranslatef(deltaShift,0,0);
  179.             break;
  180.         case SHIFT_UP:
  181.             glTranslatef(0,deltaShift,0);
  182.             break;
  183.         case SHIFT_DOWN:
  184.             glTranslatef(0,-deltaShift,0);
  185.             break;
  186.         case SHIFT_FAR:
  187.             glTranslatef(0,0,-deltaShift);
  188.             break;
  189.         case SHIFT_NEAR:
  190.             glTranslatef(0,0,deltaShift);
  191.             break;
  192.         }
  193.  
  194.         viewShift = SHIFT_NONE;
  195.         glMultMatrixf( cm );
  196.         if(matrix_mode!=GL_MODELVIEW)
  197.             glMatrixMode(matrix_mode);
  198.  
  199.     }
  200. }
  201.  
  202.  
  203. void getDisplayOptions( void)
  204. {
  205.     displayOptions.stereo = GetPrivateProfileInt("DISPLAY", "STEREO",1,"ddmesa.ini" );
  206.     displayOptions.fullScreen = GetPrivateProfileInt("DISPLAY", "FULLSCREEN",0,"ddmesa.ini" );
  207.     displayOptions.mode = GetPrivateProfileInt("DISPLAY", "MODE",1, "ddmesa.ini");
  208.     displayOptions.bpp = GetPrivateProfileInt("DISPLAY", "BPP", 32, "ddmesa.ini");
  209.  
  210. }
  211. //end modification
  212.